using System.ComponentModel.DataAnnotations;

namespace hao_Common.Consul.Options
{
    /// <summary>
    /// Consul 配置选项类
    /// 包含 Consul 服务器连接配置和服务注册配置
    /// </summary>
    public class ConsulOptions
    {
        /// <summary>
        /// 配置节名称，用于从 appsettings.json 中读取配置
        /// </summary>
        public const string SectionName = "Consul";

        /// <summary>
        /// Consul 服务器地址
        /// 默认值：localhost
        /// </summary>
        public string Host { get; set; } = "localhost";

        /// <summary>
        /// Consul 服务器端口
        /// 默认值：8500（Consul 默认端口）
        /// </summary>
        public int Port { get; set; } = 8500;

        /// <summary>
        /// Consul 数据中心名称
        /// 默认值：dc1
        /// </summary>
        public string Datacenter { get; set; } = "dc1";

        /// <summary>
        /// 服务注册配置
        /// 包含当前服务在 Consul 中的注册信息
        /// </summary>
        public ServiceRegistrationOptions ServiceRegistration { get; set; } = new();
    }

    /// <summary>
    /// 服务注册配置选项类
    /// 定义服务在 Consul 中的注册信息和健康检查配置
    /// </summary>
    public class ServiceRegistrationOptions
    {
        /// <summary>
        /// 服务名称（必填）
        /// 用于在 Consul 中标识服务类型
        /// </summary>
        [Required]
        public string ServiceName { get; set; } = string.Empty;

        /// <summary>
        /// 服务唯一标识符
        /// 如果为空，将自动生成为：{ServiceName}-{ServiceAddress}-{ServicePort}
        /// </summary>
        public string? ServiceId { get; set; }

        /// <summary>
        /// 服务地址
        /// 当前服务实例的 IP 地址或主机名
        /// </summary>
        public string ServiceAddress { get; set; } = "localhost";

        /// <summary>
        /// 服务端口
        /// 当前服务实例监听的端口号
        /// </summary>
        public int ServicePort { get; set; }

        /// <summary>
        /// 健康检查 URL
        /// Consul 用于检查服务健康状态的 HTTP 端点
        /// 例如：http://localhost:5000/health
        /// </summary>
        public string HealthCheckUrl { get; set; } = string.Empty;

        /// <summary>
        /// 健康检查间隔时间（秒）
        /// Consul 执行健康检查的频率
        /// 默认值：10秒
        /// </summary>
        public int HealthCheckInterval { get; set; } = 10;

        /// <summary>
        /// 健康检查超时时间（秒）
        /// 单次健康检查的最大等待时间
        /// 默认值：5秒
        /// </summary>
        public int HealthCheckTimeout { get; set; } = 5;

        /// <summary>
        /// 服务标签列表
        /// 用于服务分类和过滤，可包含版本号、环境等信息
        /// </summary>
        public string[] Tags { get; set; } = Array.Empty<string>();
    }
}